"""
主窗口模块 - 资产与IP综合管理系统主界面
"""

import sys
import logging
from PyQt5.QtWidgets import (
    QMainWindow, QWidget, QVBoxLayout, QHBoxLayout, 
    QMenuBar, QMenu, QAction, QToolBar, QStatusBar,
    QSplitter, QTreeWidget, QTreeWidgetItem, QTabWidget,
    QLabel, QFrame, QScrollArea
)
from PyQt5.QtCore import Qt, QSize, pyqtSignal
from PyQt5.QtGui import QIcon, QFont, QPalette, QColor

logger = logging.getLogger(__name__)

class MainWindow(QMainWindow):
    """主窗口类"""
    
    # 信号定义
    status_message = pyqtSignal(str)
    
    def __init__(self):
        super().__init__()
        self.setWindowTitle("🏢 资产与IP综合管理系统 v1.1")
        self.setMinimumSize(1200, 800)
        self.resize(1400, 900)
        
        # 设置应用样式
        self.setup_styles()
        
        # 初始化UI组件
        self.init_ui()
        
        # 初始化菜单栏
        self.init_menu_bar()
        
        # 初始化工具栏
        self.init_toolbar()
        
        # 初始化状态栏
        self.init_status_bar()
        
        # 连接信号
        self.connect_signals()
        
        logger.info("主窗口初始化完成")
    
    def setup_styles(self):
        """设置窗口样式"""
        # 设置现代风格的调色板
        palette = self.palette()
        palette.setColor(QPalette.Window, QColor(240, 240, 240))
        palette.setColor(QPalette.WindowText, QColor(30, 30, 30))
        self.setPalette(palette)
        
        # 设置全局样式表
        self.setStyleSheet("""
            QMainWindow {
                background-color: #f0f0f0;
            }
            QMenuBar {
                background-color: #ffffff;
                border-bottom: 1px solid #e0e0e0;
                padding: 2px;
            }
            QMenuBar::item {
                padding: 8px 16px;
                background-color: transparent;
            }
            QMenuBar::item:selected {
                background-color: #e3f2fd;
                color: #1976d2;
            }
            QToolBar {
                background-color: #ffffff;
                border: none;
                border-bottom: 1px solid #e0e0e0;
                spacing: 3px;
                padding: 4px;
            }
            QStatusBar {
                background-color: #ffffff;
                border-top: 1px solid #e0e0e0;
                color: #666666;
            }
            QTreeWidget {
                background-color: #ffffff;
                border: 1px solid #e0e0e0;
                border-radius: 4px;
                padding: 4px;
            }
            QTreeWidget::item {
                padding: 6px;
                border-bottom: 1px solid #f5f5f5;
            }
            QTreeWidget::item:selected {
                background-color: #e3f2fd;
                color: #1976d2;
            }
            QTabWidget::pane {
                border: 1px solid #e0e0e0;
                background-color: #ffffff;
                border-radius: 4px;
            }
            QTabBar::tab {
                background-color: #f5f5f5;
                padding: 10px 20px;
                margin-right: 2px;
                border-top-left-radius: 4px;
                border-top-right-radius: 4px;
            }
            QTabBar::tab:selected {
                background-color: #ffffff;
                border-bottom: 2px solid #1976d2;
            }
        """)
    
    def init_ui(self):
        """初始化用户界面"""
        # 创建中央窗口部件
        central_widget = QWidget()
        self.setCentralWidget(central_widget)
        
        # 创建主布局
        main_layout = QHBoxLayout(central_widget)
        main_layout.setContentsMargins(8, 8, 8, 8)
        main_layout.setSpacing(8)
        
        # 创建分割器
        splitter = QSplitter(Qt.Horizontal)
        main_layout.addWidget(splitter)
        
        # 左侧导航面板
        self.init_navigation_panel(splitter)
        
        # 右侧工作区域
        self.init_work_area(splitter)
        
        # 设置分割器比例
        splitter.setSizes([300, 1100])
    
    def init_navigation_panel(self, parent):
        """初始化左侧导航面板"""
        # 创建导航容器
        nav_container = QFrame()
        nav_container.setFrameStyle(QFrame.NoFrame)
        nav_container.setMaximumWidth(350)
        nav_container.setMinimumWidth(250)
        
        nav_layout = QVBoxLayout(nav_container)
        nav_layout.setContentsMargins(0, 0, 0, 0)
        nav_layout.setSpacing(8)
        
        # 导航标题
        nav_title = QLabel("📋 功能导航")
        nav_title.setFont(QFont("Microsoft YaHei", 12, QFont.Bold))
        nav_title.setStyleSheet("padding: 8px; color: #1976d2; background-color: #e3f2fd; border-radius: 4px;")
        nav_layout.addWidget(nav_title)
        
        # 功能树形列表
        self.function_tree = QTreeWidget()
        self.function_tree.setHeaderLabels(["功能模块"])
        self.function_tree.setHeaderHidden(True)
        
        # 添加功能节点
        self.add_function_items()
        
        nav_layout.addWidget(self.function_tree)
        
        # 添加到分割器
        parent.addWidget(nav_container)
    
    def add_function_items(self):
        """添加功能树形项"""
        # 基础管理
        basic_mgmt = QTreeWidgetItem(self.function_tree)
        basic_mgmt.setText(0, "⚙️ 基础管理")
        basic_mgmt.setFont(0, QFont("Microsoft YaHei", 10, QFont.Bold))
        
        # 字典管理
        dict_item = QTreeWidgetItem(basic_mgmt)
        dict_item.setText(0, "📚 字典管理")
        
        # 设备资产管理
        asset_item = QTreeWidgetItem(basic_mgmt)
        asset_item.setText(0, "🖥️ 设备资产")
        
        # IP管理
        ip_item = QTreeWidgetItem(basic_mgmt)
        ip_item.setText(0, "🌐 IP管理")
        ip_item.setData(0, Qt.UserRole, "ip")
        
        # 账号管理
        account_item = QTreeWidgetItem(basic_mgmt)
        account_item.setText(0, "🔐 账号管理")
        
        # 业务管理
        business_mgmt = QTreeWidgetItem(self.function_tree)
        business_mgmt.setText(0, "💼 业务管理")
        business_mgmt.setFont(0, QFont("Microsoft YaHei", 10, QFont.Bold))
        
        # 操作系统
        os_item = QTreeWidgetItem(business_mgmt)
        os_item.setText(0, "🪟 操作系统")
        
        # 业务系统
        system_item = QTreeWidgetItem(business_mgmt)
        system_item.setText(0, "🏢 业务系统")
        
        # 中间件
        middleware_item = QTreeWidgetItem(business_mgmt)
        middleware_item.setText(0, "🔧 中间件")
        
        # 带外管理
        oob_item = QTreeWidgetItem(business_mgmt)
        oob_item.setText(0, "🔌 带外管理")
        
        # 系统功能
        system_func = QTreeWidgetItem(self.function_tree)
        system_func.setText(0, "🛠️ 系统功能")
        system_func.setFont(0, QFont("Microsoft YaHei", 10, QFont.Bold))
        
        # 数据导入导出
        import_export_item = QTreeWidgetItem(system_func)
        import_export_item.setText(0, "📊 数据导入导出")
        
        # 系统设置
        settings_item = QTreeWidgetItem(system_func)
        settings_item.setText(0, "⚙️ 系统设置")
        
        # 展开所有节点
        self.function_tree.expandAll()
        
        # 连接点击事件
        self.function_tree.itemClicked.connect(self.on_function_item_clicked)
    
    def init_work_area(self, parent):
        """初始化右侧工作区域"""
        # 创建工作容器
        work_container = QFrame()
        work_container.setFrameStyle(QFrame.NoFrame)
        
        work_layout = QVBoxLayout(work_container)
        work_layout.setContentsMargins(0, 0, 0, 0)
        work_layout.setSpacing(8)
        
        # 工作区标题
        work_title = QLabel("📊 工作区域")
        work_title.setFont(QFont("Microsoft YaHei", 12, QFont.Bold))
        work_title.setStyleSheet("padding: 8px; color: #1976d2; background-color: #e3f2fd; border-radius: 4px;")
        work_layout.addWidget(work_title)
        
        # 创建标签页控件
        self.tab_widget = QTabWidget()
        self.tab_widget.setTabsClosable(True)
        self.tab_widget.setMovable(True)
        
        # 添加欢迎页面
        welcome_widget = self.create_welcome_widget()
        self.tab_widget.addTab(welcome_widget, "🏠 欢迎页面")
        
        # 连接标签页关闭事件
        self.tab_widget.tabCloseRequested.connect(self.close_tab)
        
        work_layout.addWidget(self.tab_widget)
        
        # 添加到分割器
        parent.addWidget(work_container)
    
    def create_welcome_widget(self):
        """创建欢迎页面"""
        welcome_widget = QWidget()
        welcome_layout = QVBoxLayout(welcome_widget)
        welcome_layout.setAlignment(Qt.AlignCenter)
        
        # 欢迎标题
        welcome_label = QLabel("🎉 欢迎使用资产与IP综合管理系统")
        welcome_label.setFont(QFont("Microsoft YaHei", 18, QFont.Bold))
        welcome_label.setStyleSheet("color: #1976d2; margin: 20px;")
        welcome_layout.addWidget(welcome_label)
        
        # 系统信息
        info_label = QLabel("系统版本：v1.1 | 数据库：SQLite | 界面：PyQt5")
        info_label.setFont(QFont("Microsoft YaHei", 10))
        info_label.setStyleSheet("color: #666666; margin: 10px;")
        welcome_layout.addWidget(info_label)
        
        # 功能说明
        features_text = """
        📋 主要功能：
        • 📚 字典管理 - 系统类型定义
        • 🖥️ 设备资产 - 硬件设备管理
        • 🌐 IP管理 - 网络地址分配
        • 🔐 账号管理 - 凭证信息管理
        • 🪟 操作系统 - 系统实例管理
        • 🏢 业务系统 - 应用系统管理
        • 🔧 中间件 - 服务组件管理
        • 🔌 带外管理 - 远程管理接口
        """
        
        features_label = QLabel(features_text)
        features_label.setFont(QFont("Microsoft YaHei", 10))
        features_label.setStyleSheet("color: #333333; margin: 20px; padding: 20px; background-color: #f5f5f5; border-radius: 8px;")
        welcome_layout.addWidget(features_label)
        
        # 使用说明
        usage_label = QLabel("💡 使用说明：请从左侧导航栏选择功能模块开始使用")
        usage_label.setFont(QFont("Microsoft YaHei", 10))
        usage_label.setStyleSheet("color: #666666; margin: 10px;")
        welcome_layout.addWidget(usage_label)
        
        welcome_layout.addStretch()
        
        return welcome_widget
    
    def init_menu_bar(self):
        """初始化菜单栏"""
        menubar = self.menuBar()
        
        # 文件菜单
        file_menu = menubar.addMenu("📄 文件")
        
        # 数据导入
        import_action = QAction("📥 数据导入", self)
        import_action.setShortcut("Ctrl+I")
        import_action.setStatusTip("导入Excel数据")
        file_menu.addAction(import_action)
        
        # 数据导出
        export_action = QAction("📤 数据导出", self)
        export_action.setShortcut("Ctrl+E")
        export_action.setStatusTip("导出数据到Excel")
        file_menu.addAction(export_action)
        
        file_menu.addSeparator()
        
        # 退出
        exit_action = QAction("🚪 退出", self)
        exit_action.setShortcut("Ctrl+Q")
        exit_action.setStatusTip("退出应用程序")
        exit_action.triggered.connect(self.close)
        file_menu.addAction(exit_action)
        
        # 编辑菜单
        edit_menu = menubar.addMenu("✏️ 编辑")
        
        # 刷新
        refresh_action = QAction("🔄 刷新", self)
        refresh_action.setShortcut("F5")
        refresh_action.setStatusTip("刷新当前页面")
        edit_menu.addAction(refresh_action)
        
        # 视图菜单
        view_menu = menubar.addMenu("👁️ 视图")
        
        # 全屏
        fullscreen_action = QAction("🖥️ 全屏", self)
        fullscreen_action.setShortcut("F11")
        fullscreen_action.setCheckable(True)
        fullscreen_action.setStatusTip("切换全屏模式")
        view_menu.addAction(fullscreen_action)
        
        # 工具菜单
        tools_menu = menubar.addMenu("🛠️ 工具")
        
        # 系统设置
        settings_action = QAction("⚙️ 系统设置", self)
        settings_action.setStatusTip("打开系统设置")
        tools_menu.addAction(settings_action)
        
        # 帮助菜单
        help_menu = menubar.addMenu("❓ 帮助")
        
        # 关于
        about_action = QAction("ℹ️ 关于", self)
        about_action.setStatusTip("关于本系统")
        help_menu.addAction(about_action)
    
    def init_toolbar(self):
        """初始化工具栏"""
        toolbar = QToolBar()
        toolbar.setToolButtonStyle(Qt.ToolButtonTextUnderIcon)
        self.addToolBar(toolbar)
        
        # 刷新按钮
        refresh_action = QAction("🔄", self)
        refresh_action.setText("刷新")
        refresh_action.setStatusTip("刷新当前页面")
        toolbar.addAction(refresh_action)
        
        toolbar.addSeparator()
        
        # 导入按钮
        import_action = QAction("📥", self)
        import_action.setText("导入")
        import_action.setStatusTip("导入数据")
        toolbar.addAction(import_action)
        
        # 导出按钮
        export_action = QAction("📤", self)
        export_action.setText("导出")
        export_action.setStatusTip("导出数据")
        toolbar.addAction(export_action)
        
        toolbar.addSeparator()
        
        # 设置按钮
        settings_action = QAction("⚙️", self)
        settings_action.setText("设置")
        settings_action.setStatusTip("系统设置")
        toolbar.addAction(settings_action)
    
    def init_status_bar(self):
        """初始化状态栏"""
        status_bar = QStatusBar()
        self.setStatusBar(status_bar)
        
        # 状态标签
        self.status_label = QLabel("🟢 系统就绪")
        status_bar.addWidget(self.status_label)
        
        # 数据库状态
        self.db_status_label = QLabel("🗄️ 数据库：已连接")
        status_bar.addPermanentWidget(self.db_status_label)
        
        # 用户信息
        self.user_label = QLabel("👤 管理员")
        status_bar.addPermanentWidget(self.user_label)
    
    def connect_signals(self):
        """连接信号和槽"""
        self.status_message.connect(self.update_status)
    
    def on_function_item_clicked(self, item, column):
        """功能项点击事件"""
        item_text = item.text(column)
        
        # 根据选择的功能项打开相应的标签页
        if "字典管理" in item_text:
            self.open_function_tab("📚 字典管理", "dict")
        elif "设备资产" in item_text:
            self.open_function_tab("🖥️ 设备资产", "asset")
        elif "IP管理" in item_text:
            self.open_function_tab("🌐 IP管理", "ip")
        elif "账号管理" in item_text:
            self.open_function_tab("🔐 账号管理", "account")
        elif "操作系统" in item_text:
            self.open_function_tab("🪟 操作系统", "os")
        elif "业务系统" in item_text:
            self.open_function_tab("🏢 业务系统", "system")
        elif "中间件" in item_text:
            self.open_function_tab("🔧 中间件", "middleware")
        elif "带外管理" in item_text:
            self.open_function_tab("🔌 带外管理", "oob")
        elif "数据导入导出" in item_text:
            self.open_function_tab("📊 数据导入导出", "import_export")
        elif "系统设置" in item_text:
            self.open_function_tab("⚙️ 系统设置", "settings")
    
    def open_function_tab(self, title, function_id):
        """打开功能标签页"""
        # 检查是否已存在该标签页
        for i in range(self.tab_widget.count()):
            if function_id in str(self.tab_widget.widget(i)):
                self.tab_widget.setCurrentIndex(i)
                return
        
        # 创建新的功能页面
        if function_id == "dict":
            # 字典管理模块
            try:
                from src.app.modules.dictionary.ui.dictionary_widget import DictionaryWidget
                function_widget = DictionaryWidget(self)
                logger.info("字典管理模块加载成功")
            except ImportError as e:
                logger.error(f"导入字典管理模块失败: {e}")
                logger.error(f"详细错误: {str(e)}")
                from .widgets import create_placeholder_widget
                function_widget = create_placeholder_widget(function_id)
        elif function_id == "asset":
            # 设备资产管理模块
            try:
                from src.app.modules.asset.ui.asset_widget import AssetWidget
                function_widget = AssetWidget(self)
                logger.info("设备资产管理模块加载成功")
            except ImportError as e:
                logger.error(f"导入设备资产管理模块失败: {e}")
                logger.error(f"详细错误: {str(e)}")
                from .widgets import create_placeholder_widget
                function_widget = create_placeholder_widget(function_id)
        elif function_id == "ip":
            # IP管理模块
            try:
                from src.app.modules.ip.ui.ip_widget import IpWidget
                function_widget = IpWidget(self)
                logger.info("IP管理模块加载成功")
            except ImportError as e:
                logger.error(f"导入IP管理模块失败: {e}")
                logger.error(f"详细错误: {str(e)}")
                from .widgets import create_placeholder_widget
                function_widget = create_placeholder_widget(function_id)
        elif function_id == "os":
            # 操作系统模块
            try:
                from src.app.modules.os.ui.os_widget import OsWidget
                function_widget = OsWidget(self)
                logger.info("操作系统模块加载成功")
            except ImportError as e:
                logger.error(f"导入操作系统模块失败: {e}")
                logger.error(f"详细错误: {str(e)}")
                from .widgets import create_placeholder_widget
                function_widget = create_placeholder_widget(function_id)
        elif function_id == "oob":
            # 带外管理模块
            try:
                from src.app.modules.oob.ui.oob_widget import OobWidget
                function_widget = OobWidget(self)
                logger.info("带外管理模块加载成功")
            except ImportError as e:
                logger.error(f"导入带外管理模块失败: {e}")
                logger.error(f"详细错误: {str(e)}")
                # 尝试使用占位符组件
                try:
                    from .widgets import create_placeholder_widget
                    function_widget = create_placeholder_widget(function_id)
                    logger.warning("使用占位符组件替代带外管理模块")
                except ImportError as e2:
                    logger.error(f"创建占位符组件也失败: {e2}")
                    # 创建一个简单的错误提示组件
                    from PyQt5.QtWidgets import QWidget, QVBoxLayout, QLabel
                    function_widget = QWidget()
                    layout = QVBoxLayout(function_widget)
                    error_label = QLabel(f"带外管理模块加载失败:\n{str(e)}")
                    error_label.setStyleSheet("color: red; padding: 20px;")
                    layout.addWidget(error_label)
        else:
            # 其他功能模块（占位符）
            from .widgets import create_placeholder_widget
            function_widget = create_placeholder_widget(function_id)
        
        # 添加标签页
        index = self.tab_widget.addTab(function_widget, title)
        self.tab_widget.setCurrentIndex(index)
        
        # 更新状态
        self.status_message.emit(f"已打开：{title}")
    
    def close_tab(self, index):
        """关闭标签页"""
        # 不允许关闭欢迎页面
        if index == 0:
            return
        
        self.tab_widget.removeTab(index)
    
    def update_status(self, message):
        """更新状态栏消息"""
        self.status_label.setText(message)
        logger.info(f"状态更新：{message}")
    
    def closeEvent(self, event):
        """窗口关闭事件"""
        logger.info("主窗口关闭")
        event.accept()